package com.peng.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.peng.dto.RolePermissionDTO;
import com.peng.entity.Role;
import com.peng.service.PermissionService;
import com.peng.service.RoleService;
import com.peng.utils.Result;
import com.peng.vo.RolePermissionVo;
import com.peng.vo.query.RoleQueryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import org.springframework.stereotype.Controller;

@RestController
@RequestMapping("/api/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    /**
     * 查询角色列表
     *
     * @param roleQueryVo
     * @return
     */
    @GetMapping("/list")
    public Result list(RoleQueryVo roleQueryVo) {
        // 创建分页对象
        IPage<Role> page = new Page<>(roleQueryVo.getPageNo(), roleQueryVo.getPageSize());
        roleService.findRoleListByUserId(page, roleQueryVo);
        // 返回数据
        return Result.ok(page);
    }

    /**
     * 添加角色
     *
     * @param role
     * @return
     */
    @PreAuthorize("hasAuthority('sys:role:add')")
    @PostMapping("/add")
    public Result add(@RequestBody Role role) {
        return roleService.save(role) ? Result.ok().message("添加角色成功") : Result.error().message("添加角色失败");
    }

    /**
     * 修改角色
     *
     * @param role
     * @return
     */
    @PreAuthorize("hasAuthority('sys:role:edit')")
    @PutMapping("/update")
    public Result update(@RequestBody Role role) {
        return roleService.updateById(role) ? Result.ok().message("修改角色成功") : Result.error().message("修改角色失败");
    }

    /**
     * 删除角色
     *
     * @param id
     * @return
     */
    @PreAuthorize("hasAuthority('sys:role:delete')")
    @DeleteMapping("/delete/{id}")
    public Result update(@PathVariable Long id) {
        return roleService.deleteRoleById(id) ? Result.ok().message("删除角色成功") : Result.error().message("删除角色失败");
    }

    /**
     * 检测用户角色是否被使用
     *
     * @param id
     * @return
     */
    @GetMapping("/check/{id}")
    public Result check(@PathVariable Long id) {
        //调用检测用户角色是否被使用的方法
        if (roleService.hasRoleCount(id)) {
            return Result.exist().message("该角色已分配给其他用户使用，无法删除");
        }
        return Result.ok();
    }

    /**
     * 分配权限
     *
     * @param userId
     * @param roleId
     * @return
     */
    @GetMapping("/getAssignPermissionTree")
    public Result getAssignPermissionTree(Long userId, Long roleId) {

        RolePermissionVo permissionTree = permissionService.findPermissionTree(userId, roleId);

        return Result.ok(permissionTree);
    }

    /**
     * 分配权限-保存权限数据
     *
     * @param rolePermissionDTO
     * @return
     */
    @PreAuthorize("hasAuthority('sys:role:edit')")
    @PostMapping("/saveRoleAssign")
    public Result saveRoleAssign(@RequestBody RolePermissionDTO rolePermissionDTO) {
        return roleService.saveRolePermission(rolePermissionDTO.getRoleId(), rolePermissionDTO.getList()) ? Result.ok().message("权限分配成功") : Result.error().message("权限分配失败");
    }
}

